
/**
 * ch17 类型保护 ： 在某个区域（代码块）中，可以放心的使用其属性和方法，vsc会智能提示
 */

enum Type { Strong, Week }

class Java {
    helloJava() {
        console.log('Hello Java')
    }
    java: any
}

class JavaScript {
    helloJavaScript() {
        console.log('Hello JavaScript')
    }
    javascript: any
}

function isJava(lang: Java | JavaScript): lang is Java {
    return (lang as Java).helloJava !== undefined
}

function getLanguage(type: Type, x: string | number) {
    let lang = type === Type.Strong ? new Java() : new JavaScript()
    // if ((lang as Java).helloJava) {
    //     (lang as Java).helloJava()
    // } else {
    //     (lang as JavaScript).helloJavaScript()
    // }

    // (1) instanceof
    // if ( lang instanceof Java ) {
    //     lang.helloJava()
    // } else {
    //     lang.helloJavaScript()
    // }

    // (2) in
    if ('java' in lang) {
        console.log(22)
        lang.helloJava()
    }// else {
    //     lang.helloJavaScript()
    // }
    if ('javascript' in lang) {
        lang.helloJavaScript()
    }

    // (3) typeof
    if (typeof x === 'string') {
        // x.length
    } else {
        // x.toFixed(2)
    }

    // (4) 自定义类型保护函数
    if ( isJava(lang) ) {
        console.log(11)
        lang.helloJava()
    } else {
        lang.helloJavaScript()
    }

    return lang
}

getLanguage(Type.Strong, 'xx')





